package kr.hkit.powerjava.chapter22;

import java.util.Arrays;

public class Array {
	public static<T> T getLast(T[] a) { //타입 적어줘야함
		return a[a.length-1]; 
	}
	
	public static <T extends Comparable<T>> T getMax(T[] a) { //T가 compareTo 구현하고 있어야함
		if (a ==null || a.length == 0) return null;
		
		T largest = a[0]; //가장 큰 값. 
		for(int i =1; i<a.length; i++) {
			if (largest.compareTo(a[i]) < 0) { //앞에서 빼기 뒤에꺼. 배열값이 크면 마이너스.....
				largest = a[i];
			}
		}
		return largest;
	}
	
	public static <T extends Comparable<T>> T getMin(T[] a) {
		if (a == null || a.length == 0)
			return null;

		T smallest = a[0]; // 가장 작은 값

		for (int i = 1; i < a.length; i++) {
			if (smallest.compareTo(a[i]) > 0) {
				smallest = a[i];
			}
		}
		return smallest;
	}
	

	public static void main(String[] args) {
		String[] language = {"JAVA","C#","C++","BASIC"};
		Integer[] arr = {5,4,3,2,1,9}; 
		
		String last = Array.<String>getLast(language); //호출시 <String>은 생략가능
		System.out.println(last);
		
		int aLast = Array.getLast(arr);
		System.out.println(aLast);
		
		//페이지 540 예제 
		int aMax = Array.getMax(arr);
		System.out.println(Arrays.toString(arr) + "의 배열에서 가장 큰 값은? " + aMax);
		System.out.println(Arrays.toString(arr) + "의 배열에서 가장 작은 값은? " + Array.getMin(arr));
		
		Test[] arrTest = new Test[3];
		arrTest[0] = new Test(5);
		arrTest[1] = new Test(4);
		arrTest[2] = new Test(3);
		
		System.out.println(Arrays.toString(arrTest) + "의 배열에서 가장 큰 값은? " + Array.getMax(arrTest));
		System.out.println(Arrays.toString(arrTest) + "의 배열에서 가장 작은 값은? " + Array.getMin(arrTest));
		//에러뜨는 이유는 우리가 구현한 Test클래스가 Compareble을 구현하지 않으면 에러뜸
		
	}
}


class Test implements Comparable<Test> { 
	
	private int a;

	public Test(int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	@Override
	public int compareTo(Test o) {
		return a - o.a;
	}

	@Override
	public String toString() {
		return String.format("Test [a=%s]", a);
	}
	
}
